package psrc.logic.pages.pedido;

import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;

import org.apache.struts2.util.DateFormatter;

import com.opensymphony.xwork2.ActionContext;

import psrc.logic.pages.base.ControllerBase;
import psrc.logic.pages.cliente.ClienteModel;
import psrc.logic.pages.fabrica.FabricaModel;
import psrc.logic.pages.produto.ProdutoModel;
import psrc.logic.pages.representante.RepresentanteModel;
import psrc.logic.util.Validador;
import psrc.logic.util.beans.ClienteBean;
import psrc.logic.util.beans.FabricaBean;
import psrc.logic.util.beans.PedidoBean;
import psrc.logic.util.beans.ProdutoBean;
import psrc.logic.util.beans.RepresentanteBean;
import psrc.logic.util.beans.StatusPagamento;

public class LoadPedidoInsertController extends ControllerBase {

	private static final long serialVersionUID = 1L;

	private Integer idToEdit;
	private PedidoBean beanEdit;

	private String dataPedido;
	private String dataEnvio;
	private String dataConfirmacao;
	private String numeroPedido;
	private String parcelas;
	private String dataFaturamento;
	private String dataLiquidacao;
	private String dataEntrega;
	private String status;
	private String comissao;
	private String observacoes;

	private List<String> representanteList;
	private List<String> clienteList;
	private List<String> fabricaList;
	private List<ProdutoBean> produtoList;
	private String[] produtoCheckbox;

	@Override
	public String executeController() throws Exception {
		if (idToEdit != null) {
			PedidoModel model = new PedidoModel();
			beanEdit = model.getObjectById(idToEdit);
		}
		dataPedido = new SimpleDateFormat("dd/MM/yyyy").format(new Date(System
				.currentTimeMillis()));

		representanteList = new ArrayList<String>();
		clienteList = new ArrayList<String>();
		fabricaList = new ArrayList<String>();
		produtoList = new ProdutoModel().getProductsList();

		for (RepresentanteBean bean : new RepresentanteModel()
				.getRepresentantesList())
			representanteList.add(bean.getIdRepresentante() + ", "
					+ bean.getNome());
		for (ClienteBean bean : new ClienteModel().getClientesList())
			clienteList
					.add(bean.getIdCliente() + ", " + bean.getNomeFantasia());
		for (FabricaBean bean : new FabricaModel().getFabricasList())
			fabricaList
					.add(bean.getIdFabrica() + ", " + bean.getNomeFantasia());
		// for(ProdutoBean bean : new ProdutoModel().getProductsList())
		// produtoList.add(bean.getIdProduto() + ", " + bean.getProduto());

		return SUCCESS;
	}

	public String executeSave() throws Exception {
		PedidoModel model = new PedidoModel();
		if (validar()) {
			PedidoBean bean = new PedidoBean();
			SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
			bean.setDataConfirmacao(dateCreator(dataConfirmacao));// ok
			bean.setDataEntrega(dateCreator(dataEntrega));// ok
			bean.setDataEnvio(dateCreator(dataEnvio));// ok
			bean.setDataFaturamento(dateCreator(dataFaturamento));// ok
			bean.setDataLiquidacao(dateCreator(dataLiquidacao));// ok
			bean.setDataPedido(dateCreator(dataPedido));// ok
			bean.setNumeroPedido(numeroPedido);// ok
			bean.setObservacoes(observacoes);// ok
			bean.setStatusPagamento(StatusPagamento.valueOf(status));// ok
			// passa o parcelas, comissao, produtos,
			// nomeRepresentante, cliente, fabrica
			int idRepresentante = Integer.parseInt(representanteList.get(0).split(",")[0]);
			int idCliente = Integer.parseInt(clienteList.get(0).split(",")[0]);
			int idFabrica = Integer.parseInt(fabricaList.get(0).split(",")[0]);
			
			bean.setFkCliente(idCliente);
			bean.setFkFabrica(idFabrica);
			bean.setFkRepresentante(idRepresentante);
			
			produtoList = new ProdutoModel().getProductsList();
			List<String> idsProdutos = new ArrayList<String>();
			for(int i = 0; i < produtoCheckbox.length; i++){
				idsProdutos.add(produtoList.get(Integer.parseInt(produtoCheckbox[i])).getIdProduto());
			}
			

			if (model.insert(bean, parcelas, comissao, idsProdutos)) {
				addActionMessage(getText("pedido.successful"));
			}
			return SUCCESS;
		} else {
			addActionError(getText("pedido.error.incomplete"));
			return ERROR;
		}
	}

	private Date dateCreator(String entrada){
		String[] coisaDoida = entrada.split(",");
		String[] dados = coisaDoida[0].split("/");
		Calendar calendario = Calendar.getInstance();
		calendario.set(Integer.parseInt(dados[2]),Integer.parseInt(dados[1]) -1,Integer.parseInt(dados[0]));
		Date retorno = new Date(calendario.getTimeInMillis());
		return retorno;
	}
	
	private boolean validar() {
		boolean retorno = true;

		if (!Validador.validateDate(dataPedido, true))
			retorno = false;
		if (!Validador.validateDate(dataEnvio, true))
			retorno = false;
		if (!Validador.validateDate(dataConfirmacao, false))
			retorno = false;
		if (!Validador.validateName(numeroPedido, null, true))
			retorno = false;
		if (!Validador.validateNumber(parcelas, true))
			retorno = false;
		if (!Validador.validateDate(dataFaturamento, true))
			retorno = false;
		if (!Validador.validateDate(dataLiquidacao, true))
			retorno = false;
		if (!Validador.validateDate(dataEntrega, true))
			retorno = false;
		if (!Validador.validateName(status, null, true))
			retorno = false;
		if (!Validador.validateReal(comissao, true))
			retorno = false;
		if (!Validador.validateName(observacoes, null, true))
			retorno = false;
		return retorno;
	}

	public String technicalAdaptationExecute() throws Exception {
		try {
			Map session = ActionContext.getContext().getSession();
			if (!session.containsKey("logined")
					|| !session.get("logined").equals("true")) {
				System.out
						.println("There is not an authenticated user in system. Redirecting to login page");
				return LOGIN;
			}
			return executeSave();
		} catch (Exception e) {
			e.printStackTrace();
			return "genericError";
		}
	}

	public String[] getProdutoCheckbox() {
		return produtoCheckbox;
	}

	public void setProdutoCheckbox(String[] produtoCheckbox) {
		this.produtoCheckbox = produtoCheckbox;
	}

	public String getDataEnvio() {
		return dataEnvio;
	}

	public void setDataEnvio(String dataEnvio) {
		this.dataEnvio = dataEnvio;
	}

	public String getDataConfirmacao() {
		return dataConfirmacao;
	}

	public void setDataConfirmacao(String dataConfirmacao) {
		this.dataConfirmacao = dataConfirmacao;
	}

	public String getNumeroPedido() {
		return numeroPedido;
	}

	public void setNumeroPedido(String numeroPedido) {
		this.numeroPedido = numeroPedido;
	}

	public String getParcelas() {
		return parcelas;
	}

	public void setParcelas(String parcelas) {
		this.parcelas = parcelas;
	}

	public String getDataFaturamento() {
		return dataFaturamento;
	}

	public void setDataFaturamento(String dataFaturamento) {
		this.dataFaturamento = dataFaturamento;
	}

	public String getDataLiquidacao() {
		return dataLiquidacao;
	}

	public void setDataLiquidacao(String dataLiquidacao) {
		this.dataLiquidacao = dataLiquidacao;
	}

	public String getDataEntrega() {
		return dataEntrega;
	}

	public void setDataEntrega(String dataEntrega) {
		this.dataEntrega = dataEntrega;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public String getComissao() {
		return comissao;
	}

	public void setComissao(String comissao) {
		this.comissao = comissao;
	}

	public String getObservacoes() {
		return observacoes;
	}

	public void setObservacoes(String observacoes) {
		this.observacoes = observacoes;
	}

	public List<ProdutoBean> getProdutoList() {
		return produtoList;
	}

	public void setProdutoList(List<ProdutoBean> produtoList) {
		this.produtoList = produtoList;
	}

	public String getDataPedido() {
		return dataPedido;
	}

	public void setDataPedido(String dataPedido) {
		this.dataPedido = dataPedido;
	}

	public List<String> getFabricaList() {
		return fabricaList;
	}

	public void setFabricaList(List<String> fabricaList) {
		this.fabricaList = fabricaList;
	}

	public List<String> getClienteList() {
		return clienteList;
	}

	public void setClienteList(List<String> clienteList) {
		this.clienteList = clienteList;
	}

	public List<String> getRepresentanteList() {
		return representanteList;
	}

	public void setRepresentanteList(List<String> representanteList) {
		this.representanteList = representanteList;
	}

	public Integer getIdToEdit() {
		return idToEdit;
	}

	public void setIdToEdit(Integer idToEdit) {
		this.idToEdit = idToEdit;
	}

	public PedidoBean getBeanEdit() {
		return beanEdit;
	}

	public void setBeanEdit(PedidoBean beanEdit) {
		this.beanEdit = beanEdit;
	}

}
